In [1]:
import string
import scipy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import sys
import glob
import cPickle
import skimage
sys.path.append(os.path.abspath("C:\Users\Scherer Lab E\Documents\GitHub\Python_Data_Analysis"))
import common_functions as cf
import pims
import passing_event_functions as pef
import trackpy_helper_functions as tphf
import optical_binding_of_driven_particles as obdp
C:\Users\Scherer Lab E\Anaconda2\envs\170112\lib\site-packages\skimage\viewer\utils\core.py:10: UserWarning: Recommended matplotlib backend is `Agg` for full skimage.viewer functionality.
  warn("Recommended matplotlib backend is `Agg` for full "

Load the database

In [2]:
store = pd.HDFStore("K:\Pat's_Projects\ParticleTrajectoryData\passing_event_data_trackpy_refined_extra.h5", mode='r')
keys = store.index['key']

Passing Events Grouped by Positive or Negative $\Delta R$

In [24]:
def get_rel_r_theta_particle_in_front_success_pos_or_neg_r(df, frame_window, min_r, sign):
    '''Function to retrieve del_r and del_theta from the prespective of the
    particle in front in a frame_window around each passing event.'''
    
    
    df_events = df[(df.last_pass_event == True) & (df.del_theta < 0) & (abs(df.del_r) < min_r)]
    if sign == 1:
        df_events = df_events[df_events.del_r > 0]
    else:
        df_events = df_events[df_events.del_r < 0]
    if len(df_events)==0:
        return list(pd.Series()), list(pd.Series())
    all_theta = []
    all_r = []
    for idx, series in df_events.iterrows():
        lower_frame = series.frame - frame_window
        upper_frame = series.frame + frame_window
        df_plot = df.query('@lower_frame < frame < @upper_frame')
        df_plot = df_plot[df_plot['track id'] == series['track id']]
        df_plot = df_plot[df_plot.theta_nn_id == series.theta_nn_id]
        all_theta.append(df_plot.del_theta)
        all_r.append(df_plot.del_r)
    return all_theta, all_r
In [25]:
def find_mean_passing_paths_no_kurtosis(theta_pos_neg, r_pos_neg, bin_range=[[-20,20],[-20,20]], num_bins=100):
    theta_bins = np.linspace(bin_range[0][0], bin_range[0][1], num_bins+1)
    
    theta_pos = theta_pos_neg[0]
    theta_neg = theta_pos_neg[1]
    r_pos = r_pos_neg[0]
    r_neg = r_pos_neg[1]
    
    mean_above = []
    mean_below = []
    for num in range(len(theta_bins)-1):
        lower_lim = theta_bins[num]
        upper_lim = theta_bins[num+1]
        test_r_pos = r_pos[(theta_pos > lower_lim) & (theta_pos < upper_lim)]
        test_r_pos = test_r_pos[(test_r_pos < bin_range[1][1]) & (test_r_pos > bin_range[1][0])]
        test_r_neg = r_neg[(theta_neg > lower_lim) & (theta_neg < upper_lim)]
        test_r_neg = test_r_neg[(test_r_neg < bin_range[1][1]) & (test_r_neg > bin_range[1][0])]

        mean_above_bin = test_r_pos.mean()
        mean_below_bin = test_r_neg.mean()
        mean_above.append(mean_above_bin)
        mean_below.append(mean_below_bin)

    return theta_bins, mean_above, mean_below
In [36]:
'''Exlcude the l=-5 experiments'''
keys = store.index['key']

all_theta_pos = []
all_r_pos = []
all_theta_neg = []
all_r_neg = []
for key in keys[:-5]:
    df = store.get(key)
    theta, r = get_rel_r_theta_particle_in_front_success_pos_or_neg_r(df, 15, 50, 1)
    all_theta_pos += theta
    all_r_pos += r
    
for key in keys[:-5]:
    df = store.get(key)
    theta, r = get_rel_r_theta_particle_in_front_success_pos_or_neg_r(df, 15, 50, -1)
    all_theta_neg += theta
    all_r_neg += r
    
series_all_theta_pos = pd.concat(all_theta_pos)
series_all_r_pos = pd.concat(all_r_pos)

series_all_theta_neg = pd.concat(all_theta_neg)
series_all_r_neg = pd.concat(all_r_neg)
In [38]:
from matplotlib.colors import LogNorm

concat_pos = pd.concat([series_all_r_pos, series_all_theta_pos], axis=1)
concat_pos = concat_pos.query('-20 < del_r < 20')
concat_pos = concat_pos.query('-20 < del_theta < 20')
series_all_theta_pos = concat_pos['del_theta']
series_all_r_pos = concat_pos['del_r']

concat_neg = pd.concat([series_all_r_neg, series_all_theta_neg], axis=1)
concat_neg = concat_neg.query('-20 < del_r < 20')
concat_neg = concat_neg.query('-20 < del_theta < 20')
series_all_theta_neg = concat_neg['del_theta']
series_all_r_neg = concat_neg['del_r']

theta_pos_neg = (series_all_theta_pos, series_all_theta_neg)
r_pos_neg = (series_all_r_pos, series_all_r_neg)

theta, above, below = find_mean_passing_paths_no_kurtosis(theta_pos_neg, r_pos_neg)

plt.plot(theta[:-1], above, 'C3o')
plt.plot(theta[:-1], below, 'C1o')
plt.plot(series_all_theta_pos, series_all_r_pos, '.', ms=1, alpha=0.3)
#plt.plot(series_all_theta_neg, series_all_r_neg, 'C5.', ms=0.5, alpha=0.1)
#plt.hist2d(series_all_theta, series_all_r, bins=50, range=[[-20, 20],[-20, 20]], norm=LogNorm())
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.xlabel(r"$\Delta \theta$")
plt.ylabel(r"$\Delta r$")
Out[38]:
<matplotlib.text.Text at 0x10ba06a0>
In [20]:
f = open("C:\Users\Scherer Lab E\Box Sync\Passing\Figures and Data\Data\pass_event_mean_path.pkl", mode='w')
cPickle.dump([above, below, theta, theta_pos_neg, r_pos_neg], f)
f.close()

Mean Path either Positive or Negative Seperated by L

In [21]:
index = store.index
L_groups_data = []
Ls = [[1,2], [3, 4], [5],[-5]]
for L in Ls:
    keys = index[index['L'].isin(L)].key
    all_theta_pos = []
    all_r_pos = []
    all_theta_neg = []
    all_r_neg = []
    for key in keys:
        df = store.get(key)
        theta, r = get_rel_r_theta_particle_in_front_success_pos_or_neg_r(df, 15, 50, 1)
        all_theta_pos += theta
        all_r_pos += r
    
    for key in keys:
        df = store.get(key)
        theta, r = get_rel_r_theta_particle_in_front_success_pos_or_neg_r(df, 15, 50, -1)
        all_theta_neg += theta
        all_r_neg += r

    series_all_theta_pos = pd.concat(all_theta_pos)
    series_all_r_pos = pd.concat(all_r_pos)

    series_all_theta_neg = pd.concat(all_theta_neg)
    series_all_r_neg = pd.concat(all_r_neg)

    concat_pos = pd.concat([series_all_r_pos, series_all_theta_pos], axis=1)
    concat_pos = concat_pos.query('-20 < del_r < 20')
    concat_pos = concat_pos.query('-20 < del_theta < 20')
    series_all_theta_pos = concat_pos['del_theta']
    series_all_r_pos = concat_pos['del_r']

    concat_neg = pd.concat([series_all_r_neg, series_all_theta_neg], axis=1)
    concat_neg = concat_neg.query('-20 < del_r < 20')
    concat_neg = concat_neg.query('-20 < del_theta < 20')
    series_all_theta_neg = concat_neg['del_theta']
    series_all_r_neg = concat_neg['del_r']
    
    theta_pos_neg = (series_all_theta_pos, series_all_theta_neg)
    r_pos_neg = (series_all_r_pos, series_all_r_neg)
    theta, above, below = find_mean_passing_paths_no_kurtosis(theta_pos_neg, r_pos_neg, num_bins=30)

    plt.plot(theta[:-1], above, 'C3o')
    plt.plot(theta[:-1], below, 'C1o')
    plt.title('Passing Events for L='+str(L)+' with '+str(len(keys))+' experiments')
    #plt.plot(series_all_theta, series_all_r)
    plt.hist2d(series_all_theta, series_all_r, bins=30, range=[[-20, 20],[-20, 20]], norm=LogNorm())
    plt.xlabel(r"$\Delta \theta$")
    plt.ylabel(r"$\Delta r$")
    plt.show()
    
    L_groups_data.append([above, below, theta, theta_pos_neg, r_pos_neg])
In [43]:
f = open("C:\Users\Scherer Lab E\Box Sync\Passing\Figures and Data\Data\pass_event_mean_path_grouped_Ls.pkl", mode='w')
cPickle.dump(L_groups_data, f)
f.close()